<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>src/theme/class.CSSManager.js - sceneGraph.js</title>
    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    <link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
</head>
<body class="yui3-skin-sam">

<div id="doc">
    <div id="hd" class="yui3-g header">
        <div class="yui3-u-3-4">
            
                <h1><img src="../../logo/logoCGSG_256x57.png" title="sceneGraph.js"></h1>
            
        </div>
        <div class="yui3-u-1-4 version">
            <em>API Docs for: v2.1.0</em>
        </div>
    </div>
    <div id="bd" class="yui3-g">

        <div class="yui3-u-1-4">
            <div id="docs-sidebar" class="sidebar apidocs">
                <div id="api-list">
    <h2 class="off-left">APIs</h2>
    <div id="api-tabview" class="tabview">
        <ul class="tabs">
            <li><a href="#api-classes">Classes</a></li>
            <li><a href="#api-modules">Modules</a></li>
        </ul>

        <div id="api-tabview-filter">
            <input type="search" id="api-filter" placeholder="Type to filter APIs">
        </div>

        <div id="api-tabview-panel">
            <ul id="api-classes" class="apis classes">
            
                <li><a href="../classes/CGSG.html">CGSG</a></li>
            
                <li><a href="../classes/CGSGAccordion.html">CGSGAccordion</a></li>
            
                <li><a href="../classes/CGSGAnimationManager.html">CGSGAnimationManager</a></li>
            
                <li><a href="../classes/CGSGAnimationMethod.html">CGSGAnimationMethod</a></li>
            
                <li><a href="../classes/CGSGBindEntry.html">CGSGBindEntry</a></li>
            
                <li><a href="../classes/CGSGButtonMode.html">CGSGButtonMode</a></li>
            
                <li><a href="../classes/CGSGCollisionGhostOnDemandTester.html">CGSGCollisionGhostOnDemandTester</a></li>
            
                <li><a href="../classes/CGSGCollisionManager.html">CGSGCollisionManager</a></li>
            
                <li><a href="../classes/CGSGCollisionMethod.html">CGSGCollisionMethod</a></li>
            
                <li><a href="../classes/CGSGCollisionRegionTester.html">CGSGCollisionRegionTester</a></li>
            
                <li><a href="../classes/CGSGCollisionTesterFactory.html">CGSGCollisionTesterFactory</a></li>
            
                <li><a href="../classes/CGSGColor.html">CGSGColor</a></li>
            
                <li><a href="../classes/CGSGCSSManager.html">CGSGCSSManager</a></li>
            
                <li><a href="../classes/CGSGDimension.html">CGSGDimension</a></li>
            
                <li><a href="../classes/CGSGEvent.html">CGSGEvent</a></li>
            
                <li><a href="../classes/CGSGEventManager.html">CGSGEventManager</a></li>
            
                <li><a href="../classes/CGSGHandleBox.html">CGSGHandleBox</a></li>
            
                <li><a href="../classes/CGSGImgManager.html">CGSGImgManager</a></li>
            
                <li><a href="../classes/CGSGInterpolator.html">CGSGInterpolator</a></li>
            
                <li><a href="../classes/CGSGInterpolatorLinear.html">CGSGInterpolatorLinear</a></li>
            
                <li><a href="../classes/CGSGInterpolatorTCB.html">CGSGInterpolatorTCB</a></li>
            
                <li><a href="../classes/CGSGKeyFrame.html">CGSGKeyFrame</a></li>
            
                <li><a href="../classes/CGSGMap.html">CGSGMap</a></li>
            
                <li><a href="../classes/CGSGMask.html">CGSGMask</a></li>
            
                <li><a href="../classes/CGSGMaskCache.html">CGSGMaskCache</a></li>
            
                <li><a href="../classes/CGSGMaskClip.html">CGSGMaskClip</a></li>
            
                <li><a href="../classes/CGSGMath.html">CGSGMath</a></li>
            
                <li><a href="../classes/CGSGNode.html">CGSGNode</a></li>
            
                <li><a href="../classes/CGSGNodeButton.html">CGSGNodeButton</a></li>
            
                <li><a href="../classes/CGSGNodeCircle.html">CGSGNodeCircle</a></li>
            
                <li><a href="../classes/CGSGNodeColorPicker.html">CGSGNodeColorPicker</a></li>
            
                <li><a href="../classes/CGSGNodeCurveTCB.html">CGSGNodeCurveTCB</a></li>
            
                <li><a href="../classes/CGSGNodeDomElement.html">CGSGNodeDomElement</a></li>
            
                <li><a href="../classes/CGSGNodeEllipse.html">CGSGNodeEllipse</a></li>
            
                <li><a href="../classes/CGSGNodeImage.html">CGSGNodeImage</a></li>
            
                <li><a href="../classes/CGSGNodeLine.html">CGSGNodeLine</a></li>
            
                <li><a href="../classes/CGSGNodeSlider.html">CGSGNodeSlider</a></li>
            
                <li><a href="../classes/CGSGNodeSliderHandle.html">CGSGNodeSliderHandle</a></li>
            
                <li><a href="../classes/CGSGNodeSprite.html">CGSGNodeSprite</a></li>
            
                <li><a href="../classes/CGSGNodeSquare.html">CGSGNodeSquare</a></li>
            
                <li><a href="../classes/CGSGNodeTabMenu.html">CGSGNodeTabMenu</a></li>
            
                <li><a href="../classes/CGSGNodeText.html">CGSGNodeText</a></li>
            
                <li><a href="../classes/CGSGNodeWebview.html">CGSGNodeWebview</a></li>
            
                <li><a href="../classes/CGSGParticle.html">CGSGParticle</a></li>
            
                <li><a href="../classes/CGSGParticleEmitter.html">CGSGParticleEmitter</a></li>
            
                <li><a href="../classes/CGSGParticleSystem.html">CGSGParticleSystem</a></li>
            
                <li><a href="../classes/CGSGPickNodeMethod.html">CGSGPickNodeMethod</a></li>
            
                <li><a href="../classes/CGSGPosition.html">CGSGPosition</a></li>
            
                <li><a href="../classes/CGSGRegion.html">CGSGRegion</a></li>
            
                <li><a href="../classes/CGSGRotation.html">CGSGRotation</a></li>
            
                <li><a href="../classes/CGSGScale.html">CGSGScale</a></li>
            
                <li><a href="../classes/CGSGSceneGraph.html">CGSGSceneGraph</a></li>
            
                <li><a href="../classes/CGSGSection.html">CGSGSection</a></li>
            
                <li><a href="../classes/CGSGTimeline.html">CGSGTimeline</a></li>
            
                <li><a href="../classes/CGSGTraverser.html">CGSGTraverser</a></li>
            
                <li><a href="../classes/CGSGVector2D.html">CGSGVector2D</a></li>
            
                <li><a href="../classes/CGSGView.html">CGSGView</a></li>
            
                <li><a href="../classes/CGSGWEBVIEWMODE.html">CGSGWEBVIEWMODE</a></li>
            
                <li><a href="../classes/CGSGWrapMode.html">CGSGWrapMode</a></li>
            
                <li><a href="../classes/GLOBAL_CONSTANTS.html">GLOBAL_CONSTANTS</a></li>
            
                <li><a href="../classes/GLOBAL_METHODS.html">GLOBAL_METHODS</a></li>
            
                <li><a href="../classes/GLOBAL_PROPERTIES.html">GLOBAL_PROPERTIES</a></li>
            
                <li><a href="../classes/UTIL_ARRAY.html">UTIL_ARRAY</a></li>
            
                <li><a href="../classes/WUICCGSGNodeImageFactory.html">WUICCGSGNodeImageFactory</a></li>
            
            </ul>

            <ul id="api-modules" class="apis modules">
            
                <li><a href="../modules/Animation.html">Animation</a></li>
            
                <li><a href="../modules/Collision.html">Collision</a></li>
            
                <li><a href="../modules/Math.html">Math</a></li>
            
                <li><a href="../modules/Node.html">Node</a></li>
            
                <li><a href="../modules/ParticleSystem.html">ParticleSystem</a></li>
            
                <li><a href="../modules/Scene.html">Scene</a></li>
            
                <li><a href="../modules/Util.html">Util</a></li>
            
            </ul>
        </div>
    </div>
</div>

            </div>
        </div>
        <div class="yui3-u-3-4">
                <div id="api-options">
        Show:
        <label for="api-show-inherited">
            <input type="checkbox" id="api-show-inherited" checked>
            Inherited
        </label>

        <label for="api-show-protected">
            <input type="checkbox" id="api-show-protected">
            Protected
        </label>

        <label for="api-show-private">
            <input type="checkbox" id="api-show-private">
            Private
        </label>
        <label for="api-show-deprecated">
            <input type="checkbox" id="api-show-deprecated">
            Deprecated
        </label>

    </div>


            <div class="apidocs">
                <div id="docs-main">
                    <div class="content">
                        <h1 class="file-heading">File: src/theme/class.CSSManager.js</h1>

<div class="file">
    <pre class="code prettyprint linenums">
/*
 * Copyright (c) 2014 Gwennael Buchet
 *
 * License/Terms of Use
 *
 * Permission is hereby granted, free of charge and for the term of intellectual property rights on the Software, to any
 * person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), to use, copy, modify
 * and propagate free of charge, anywhere in the world, all or part of the Software subject to the following mandatory
 * conditions:
 *
 *   •    The above copyright notice and this permission notice shall be included in all copies or substantial portions
 *   of the Software.
 *
 *  Any failure to comply with the above shall automatically terminate the license and be construed as a breach of these
 *  Terms of Use causing significant harm to Gwennael Buchet.
 *
 *  THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 *  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
 *  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 *  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 *  SOFTWARE.
 *
 *  Except as contained in this notice, the name of Gwennael Buchet shall not be used in advertising or otherwise to promote
 *  the use or other dealings in this Software without prior written authorization from Gwennael Buchet.
 *
 *  These Terms of Use are subject to French law.
 */

/**
 * A CGSGCSSManager represent a basic circle
 *
 * @class CGSGCSSManager
 * @module Util
 * @extends CGSGObject
 * @constructor
 * @type {CGSGCSSManager}
 * @author Gwennael Buchet (gwennael.buchet@gmail.com)
 */
var CGSGCSSManager = CGSGObject.extend(
    {
        initialize: function () {
            /**
             * @property _isLoaded
             * @type {Boolean}
             * @private
             */
            this.isLoaded = false;

            /**
             * Event Fired when the css file is finally loaded
             * @property onLoadEnd
             * @default null
             * @type {Function} {node:this}
             */
            this.onLoadEnd = null;
            /**
             * Event Fired when the css file failed to load
             * @property onLoadError
             * @default null
             * @type {Function} {node:this}
             */
            this.onLoadError = null;
            /**
             * Event Fired when the css file loading is aborted
             * @property onLoadAbort
             * @default null
             * @type {Function} {node:this}
             */
            this.onLoadAbort = null;

            /**
             * All css classes loaded for the current HTML document.
             * [selectorText {String}, style {CSSStyleDeclaration}]
             * @property _classes
             * @type {Array}
             * @private
             */
            this._classes = new CGSGMap();

            /**
             * List of CSS files to be ignored
             * @property _blacklist
             * @type {Array}
             * @private
             */
            this._blacklist = [];

        },

        /**
         * Return the value for the attribute of the class passed as parameters
         * @method getAttr
         * @param cls {String} Name of the CSS class
         * @param attr {String} Name of the attribute
         * @return {string}
         */
        getAttr: function (cls, attr) {
            cls = cls.addFirstDot();
            var style = this._classes.getValue(cls);

            if (cgsgExist(style)) {
                var s = style[attr.collapse()];
                if (cgsgExist(s) &amp;&amp; s.length &gt; 0) {
                    return s;
                }
            }

            return null;
        },

        /**
         * Return the value for the latest attribute of the classes passed as parameters
         * @method getAttrInArray
         * @param clss {Array} list of CSS classes
         * @param attr {String} name of the CSS attribute
         * @return {string} value for the CSS attribute
         */
        getAttrInArray: function (clss, attr) {
            var i, cls, r, len = clss.length;
            for (i = len - 1; i &gt;= 0; --i) {
                cls = clss[i];

                r = this.getAttr(cls, attr);
                if (cgsgExist(r)) {
                    return r;
                }
            }

            return null;
        },

        /**
         * @method getCls
         * @param cls {String} Name of the CSS class
         * @return {Array} Array of attributes
         */
        getCls: function (cls) {
            cls = cls.addFirstDot();
            return this._classes.getValue(cls);
        },

        /**
         * Extract the number from an attribute&#x27;s value.
         * For example getNumber(&quot;8px&quot;); will return 8.
         * @method getNumber
         * @param attr {String}
         * @return {Number}
         */
        getURL: function (attr) {
            if (!cgsgExist(attr) || attr.length == 0) {
                return null;
            }

            //remove first &quot;url(&quot;
            var url = attr.without(&quot;url(&quot;);

            //remove latest right parenthesis &quot;)&quot;
            url = url.without(&quot;)&quot;);

            return url;
        },

        /**
         * Extract the number from an attribute&#x27;s value.
         * For example getNumber(&quot;8px&quot;); will return 8.
         * @method getNumber
         * @param attr {String}
         * @return {Number}
         */
        getNumber: function (attr) {
            if (!cgsgExist(attr) || attr.length == 0) {
                return NaN;
            }

            attr = this._cleanAttr(attr);

            return parseInt(attr);
        },

        /**
         * Extract the number from an attribute&#x27;s value.
         * For example getFloat(&quot;0.6px&quot;); will return 0.6.
         * @method getFloat
         * @param attr {String}
         * @return {Float}
         */
        getFloat: function (attr) {
            if (!cgsgExist(attr) || attr.length == 0) {
                return null;
            }

            attr = this._cleanAttr(attr);

            return parseFloat(attr);
        },

        _cleanAttr: function (attr) {
            //remove &quot;px&quot;, &quot;pt&quot;, ...
            var reg = /px|pt/gi;
            attr = attr.replace(reg, &quot;&quot;);

            //remove spaces
            attr.trim();

            return attr;
        },

        /**
         * Read content of all CSS files loaded and update its cache
         * @method invalidateCache
         *
         */
        invalidateCache: function () {
            this._classes.removeAll();
            var len, x, nbStyles = document.styleSheets.length;
            //read all documents
            for (var s = 0; s &lt; nbStyles; s++) {
                //ignore blacklisted files
                if (!this._blacklist.contains(document.styleSheets[s].href)) {
                    var classes = document.styleSheets[s].rules || document.styleSheets[s].cssRules;
                    if (cgsgExist(classes)) {
                        for (x = 0, len = classes.length; x &lt; len; x++) {
                            this._classes.addOrReplace(classes[x].selectorText, classes[x].style);
                        }
                    }
                    else {
                        console.log(&quot;WARNING: &#x27;&quot; +
                                    document.styleSheets[s].href +
                                    &quot;&#x27; file without class. Be sure application is running under a web server and CSS file is correctly loaded.&quot;);
                    }
                }
            }
        },

        /**
         * Store CSS attributes form the file in memory
         * @method loadCSSFile
         * @param url {String}
         */
        loadCSSFile: function (url) {
            this.isLoaded = false;
            this._url = url;

            var headID = document.getElementsByTagName(&quot;head&quot;)[0];
            var cssNode = document.createElement(&#x27;link&#x27;);

            cssNode.onload = this._createDelegate(this, this._onFileLoaded);
            cssNode.onerror = this._createDelegate(this, this._onFileError);
            cssNode.onabort = this._createDelegate(this, this._onFileAbort);

            cssNode.type = &#x27;text/css&#x27;;
            cssNode.rel = &#x27;stylesheet&#x27;;
            cssNode.media = &#x27;screen&#x27;;
            cssNode.href = url;
            headID.appendChild(cssNode);
        },

        /**
         * Unload CSS file from current HTML page.
         * Cache need to be invalidated after by calling {invalidateCache} method
         * @method unloadCSSFile
         * @param filename {String}
         */
        unloadCSSFile: function (filename) {
            var href = &quot;href&quot;;

            var cssFiles = document.getElementsByTagName(&quot;link&quot;);
            for (var i = cssFiles.length; i &gt;= 0; i--) {
                if (cssFiles[i] &amp;&amp; cssFiles[i].getAttribute(href) != null &amp;&amp;
                    cssFiles[i].getAttribute(href).indexOf(filename) != -1) {
                    cssFiles[i].parentNode.removeChild(cssFiles[i]);
                }
            }
        },

        /**
         * Blacklist this file.
         * Cache need to be invalidated after by calling {invalidateCache} method
         * @method ignoreCSSFile
         * @param href {String} Must be full href path and filename
         */
        ignoreCSSFile: function (href) {
            this._blacklist.push(href);
        },

        /**
         * used to call delegate method when the css file is finally loaded
         * @private
         * @method _createDelegate
         * @param objectContext
         * @param delegateMethod
         * @return {Function}
         */
        _createDelegate: function (objectContext, delegateMethod) {
            return function () {
                return delegateMethod.call(objectContext);
            }
        },

        /**
         * fired when the css file is loaded.
         * @private
         * @method _onFileLoaded
         * @param event {Event}
         */
        _onFileLoaded: function (event) {
            this.invalidateCache();
            this.isLoaded = true;

            if (this.onLoadEnd !== null) {
                this.onLoadEnd({event: event});
            }
        },

        /**
         * To be overrided when the css file failed to load
         * @method _onFileError
         * @protected
         * @param event {Event}
         */
        _onFileError: function (event) {
            if (this.onLoadError !== null) {
                this.onLoadError({event: event});
            }
        },
        /**
         * To be overrided when the css file loading is aborted
         * @method _onFileAbort
         * @protected
         * @param event {Event}
         */
        _onFileAbort: function (event) {
            if (this.onLoadAbort !== null) {
                this.onLoadAbort({event: event});
            }
        }

    }
);
    </pre>
</div>

                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="../assets/vendor/prettify/prettify-min.js"></script>
<script>prettyPrint();</script>
<script src="../assets/js/yui-prettify.js"></script>
<script src="../assets/../api.js"></script>
<script src="../assets/js/api-filter.js"></script>
<script src="../assets/js/api-list.js"></script>
<script src="../assets/js/api-search.js"></script>
<script src="../assets/js/apidocs.js"></script>
</body>
</html>
